共计 2096 个字符,预计需要花费 6 分钟才能阅读完成。
htaccess文件是WordPress网站根目录下的一个隐藏文件,文件名 .htaccess
,在wordpress建站过程中作为Apache服务器中的一个配置文件,它负责相关目录下的网页配置。 通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、允许/阻止特定的用户或者目录的访问、配置默认文档等功能。
最近,我在统计模块发现未知域名解析到我的站点ip,于是就想通过配置301规则实现永久跳转,消除未知域名解析的影响,我将配置写进标签 # BEGIN WordPress
和 # END WordPress
中间,方案可行。使用一段时间之后,偶然发现配置失效,检查htaccess文件,发现文件内容恢复到初始状态,新增配置规则被覆盖没有了。
原因
查询资料,# BEGIN WordPress
和 # END WordPress
之间配置的规则存在被覆盖重写的场景,其一就是当我们点击了 仪表盘 - 设置 - 固定连接
,注意只要点击了,就会出发复写机制,该标记段落内所有的配置规则就会恢复到默认状态,裴先生认为这或许是一个bug的存在。
默认配置
# BEGIN WordPress
# 在“BEGIN WordPress”与“END WordPress”之间的指令(行)是
# 动态生成的,只应被WordPress过滤器修改。
# 任何对标记之间的指令的修改都会被覆盖。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress
解决方案
将需要添加在.htaccess
中的规则,写在# BEGIN WordPress
和# END WordPress
之外,这样WordPress就不会覆盖您的设置了。
比如裴先生需要添加两处规则:
- 将未知域名301重定向
# BEGIN WordPress
# 在“BEGIN WordPress”与“END WordPress”之间的指令(行)是
# 动态生成的,只应被WordPress过滤器修改。
# 任何对标记之间的指令的修改都会被覆盖。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress
# 新增配置规则
<IfModule mod_rewrite.c>
# 开启重写引擎
RewriteEngine On
# 检查是否是 crushnear.com 或 www.crushnear.com
RewriteCond %{HTTP_HOST} ^crushnear\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.crushnear\.com$
# 如果是,则重定向到 https://blog.peiluming.com,并保留原始的请求路径和查询字符串
RewriteRule ^(.*)$ https://blog.peiluming.com/$1 [R=301,L]
</IfModule>
- 将http请求301重定向到https
# BEGIN WordPress
# 在“BEGIN WordPress”与“END WordPress”之间的指令(行)是
# 动态生成的,只应被WordPress过滤器修改。
# 任何对标记之间的指令的修改都会被覆盖。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress
# 新增配置规则
<IfModule mod_rewrite.c>
# 开启重写引擎
RewriteEngine On
# 检查是否是 HTTP 协议
RewriteCond %{HTTPS} off
# 如果是,则重定向到 HTTPS 协议,并保留原始的请求路径和查询字符串
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
正文完